package unsafe;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
    public static void main(String[] args) {
        /**
         * 集齐7颗龙珠召唤神龙
         */
        // 主线程 召唤龙珠的线程
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,() -> {
            System.out.println("召唤神龙成功");
        });
        for (int i = 1; i <= 7; i++) {
            // 子线程
            int finalI = i;
//            这里JDK1.8之前如果finalIst不是final类型的，lambda能操作到finalI吗？不能，finalI是局部变量
//            现在JDK1.8之后默认是final类型的。jdk8检测你局部变量没有被修改，编译时会给你加上final。
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "收集了第" + finalI + "颗龙珠");
                try {
                    cyclicBarrier.await(); // 加法计数 等待
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}
/*
注意：如果 CyclicBarrier cyclicBarrier = new CyclicBarrier(7,() -> {
            System.out.println("召唤神龙成功");
        });不是用7而是用了8，那么不会输出召唤神龙成功输出，因为线程里就集齐了7个，由于计数器要加到8之后才可以继续往下执行
执行结果：
Thread-1收集了第2颗龙珠
Thread-2收集了第3颗龙珠
Thread-0收集了第1颗龙珠
Thread-3收集了第4颗龙珠
Thread-4收集了第5颗龙珠
Thread-5收集了第6颗龙珠
Thread-6收集了第7颗龙珠
召唤神龙成功
 */